#include "imagecopythread.h"
#include <QDir>
#include <QDebug>
#include <QStack>
ImageCopyThread::ImageCopyThread(const QString& srcDir,const QString& destDir)
            :_src_dir(srcDir),_dest_dir(destDir),_is_cut(false)
{

}

void ImageCopyThread::run()
{
    QString type = _copy_list.join(" ");

    emit progressUpdate(0,QString("正在搜索%1文件....").arg(type));
    QList<QString>imageNames; // 保存的是绝对路径
    scanFolderForImageNames(_src_dir,imageNames);

    int total = imageNames.size();
    if(0 == total){
        emit progressUpdate(0,QString("未找到%1文件").arg(type));
        return;
    }

    for(int i = 0;i < total;i++){
        QString srcPath = imageNames[i];
        QFileInfo info(srcPath);

        // 获取文件名
        QString fileName = info.fileName();

        // 创建新的路径
        QString destFilePath = _dest_dir + "/" + fileName;

        // 判断这个文件路径是否存在
        int count = 1; // 如果存在那么在后面加上 _1  _2下标
        while(QFile::exists(destFilePath)){
            destFilePath = _dest_dir + "/" + info.baseName() + "_" +
                    QString::number(count) + "." +info.suffix();
            count++;
        }

        // 新的文件名进行拷贝
        if(QFile::copy(srcPath,destFilePath)){
            int progress = (i+1) * 100 / total;
            emit progressUpdate(progress,QString("复制中:%1").arg(info.fileName()));
            if(_is_cut){
                QFile::remove(srcPath);
            }
        }else{
            emit progressUpdate(-1,QString("复制失败:%1").arg(info.fileName()));
            return; // 直接退出吧
        }
    }
    emit progressUpdate(100,"复制完成");

}

void ImageCopyThread::isCutToNewPath(bool is_cut)
{
    _is_cut = is_cut;
}

void ImageCopyThread::setCopyType(const QStringList& list)
{
    _copy_list = list;
}

void ImageCopyThread::scanFolderForImageNames(const QString &dirPath,
                                              QList<QString> &imageNames)
{
    // 判断文件夹是否存在
    QDir dir(dirPath);
    if(!dir.exists()){
        return;
    }

    // 获取文件夹下所有文件名称
    // QDir::Files | QDir::Dirs 文件与目录
    // NoDotAndDotDot不包含 .  ..
   /* QFileInfoList listInfo = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
    qDebug() << "imageNames size:" << imageNames.size();
    for(const auto& info : listInfo){
        if(info.isDir()){ // 是目录，继续递归
            scanFolderForImageNames(info.path(),imageNames);
        }else{
            // 不是目录，判断是否是图片格式
            // 获取后缀
            QString suffix = info.suffix();
            if(QStringList({"jpg","jpeg","png","bmp","gif"}).contains(suffix,Qt::CaseInsensitive)){
                imageNames.push_back(info.filePath());
            }
        }
    }*/ // 当图片过大的时候递归会崩溃掉

    // 使用栈替代
    QStack<QString> dirStack;
    dirStack.push(dirPath);

    while(!dirStack.isEmpty()){
        // 出栈
        QString currentDir = dirStack.pop();

        // 防止运行的过程中这个文件夹被删除掉了，或者路径损坏
        QDir dir(currentDir);
        if(!dir.exists()){
            continue;
        }

        // 获取此文件夹中的所有文件
        QFileInfoList infoList = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
        for(const auto& info : infoList){
            if(info.isDir()){
                // 入栈
                dirStack.push(info.filePath());
            }else{
                // 文件
                // 获取后缀
                QString suffix = info.suffix();

                if(_copy_list.contains(suffix,Qt::CaseInsensitive)){
                    imageNames.push_back(info.filePath());
                }
            }

        }

    }


}
